package com.atguigu.advice;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.lang.reflect.Modifier;

/**
 * @版本： V5.1.0
 * @版权： Copyright @ 2025 广东广昱信息科技有限公司版权所有
 * @作者： 广东广昱信息科技有限公司
 * @日期： 2025-06-16 20:00
 *
 * 1.定义方法 - 增强代码
 * 2.使用注解指定对应的位置
 * 3.配置切点表达式选中方法
 * 4.切面和ioc的配置
 * 5.开启aspectj注解的支持
 * TODO: 增强方法中获取目标方法信息
 *  1.全部增强方法中,获取目标方法的信息(方法名,参数,访问修饰符,所属的类的信息...)
 *  (JoinPoint joinPoint) import org.aspectj.lang.JoinPoint;
 *  joinPoint包含目标方法的信息!
 *  2.返回的结果 - @AfterReturning
 *  (Object result)result 接收返回结果
 *      @AfterReturning(value = "execution(* com..impl.*.*(..))",returning = "形参名即可")
 *  3.异常的信息 - @AfterThrowing
 *      (Throwable throwable)
 *      @AfterThrowing(value = "execution(* com..impl.*.*(..))",throwing = "形参名即可")
 */
@Component
@Aspect
public class MyAdvice {


    @Before("com.atguigu.pointcut.MyPointCut.myPc()")
    public void before(JoinPoint joinPoint){
        //1.获取方法属于的类的信息
        String simpleName = joinPoint.getTarget().getClass().getSimpleName();
        //2.获取方法名称
        int modifiers = joinPoint.getTarget().getClass().getModifiers();
        String s = Modifier.toString(modifiers);
        String name = joinPoint.getSignature().getName();//获取方法名
        //3.获取参数列表
        Object[] args = joinPoint.getArgs();//获取目标方法参数

    }

    @AfterReturning(value = "com.atguigu.pointcut.MyPointCut.myPc()",returning = "result")
    public void afterReturning(JoinPoint joinPoint,Object result){

    }

    @After("com.atguigu.pointcut.MyPointCut.myPc()")
    public void after(JoinPoint joinPoint){

    }

    @AfterThrowing(value = "com.atguigu.pointcut.MyPointCut.myPc()",throwing = "throwable")
    public void afterThrowing(JoinPoint joinPoint,Throwable throwable){

    }
}
